package com.qf.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 前置拦截，请求到达控制器方法之前执行
     *    返回true，放行到控制器方法
     *    返回false，请求到此为止，控制器方法不执行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /*
            请求路径： http://localhost:8080/user/findByPage?username=zs

            URL:http://localhost:8080/user/findByPage
            URI:/user/findByPage
            QueryString: ?username=zs
        */
      /*
        //放行不需要拦截的资源--登录&注册相关的
        //① 先得知道当前访问的是什么资源
        String uri = request.getRequestURI();

        //② 然后在执行判断是否放行
        if (uri.endsWith("/login")){
            return true;
        }*/

        //判断当前是否登录，如果登录，返回true，否则返回false
        //判断登录的依据，根据session中是否有登陆有的用户信息
        Object user = request.getSession().getAttribute("user");
        if (user == null){
            //没有登录
            response.setContentType("text/html;charset=utf-8");
            response.getWriter().write("尚未登录，请先登录");
            return false;
        }
        //放行
        return true;
    }

    /**
     * 在控制器方法正常执行完后，会执行的
     * 如果控制器方法执行失败了，这个方法是不执行的
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    /**
     * 不管控制器方法执行是否成功，这个方法一定会执行的
     * 相当于：
     *      boolean f = preHandle();
     *      if(f){
                try{
                     控制器方法
                     postHandle()
                 }finally{
                     afterCompletion()
                 }
     *     }
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}
